package com.bygf.curve.axis;

import com.bygf.curve.interfac.AxisChangeListener;
import com.bygf.curve.panel.ChartPanel;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import javax.swing.JPanel;

/**
 * 坐标轴父类
 *
 * @author sunyupei
 */
public abstract class Axis extends JPanel {

    /**
     * ChartPanel
     */
    protected ChartPanel chartPanel;
    /**
     * 坐标轴标题
     */
    protected String title = "";
    /**
     * 坐标轴标题字体
     */
    protected Font titleFont = new Font("宋体", Font.PLAIN, 12);
    /**
     * 坐标轴起始点，用于当前显示
     */
    protected double startValueNow = 0;
    /**
     * 坐标轴起始点，用于坐标重置时使用
     */
    private double startValue = 0;
    /**
     * 坐标轴终止点，用于当前显示
     */
    protected double endValueNow = 20000;
    /**
     * 坐标轴终止点，用于坐标重置时使用
     */
    private double endValue = 20000;
    /**
     * 绘制刻度线的起止位置
     */
    protected int drawStart = 0;
    /**
     * 绘制刻度线的终止位置
     */
    protected int drawEnd = 100;
    /**
     * 刻度线颜色
     */
    protected Color lineColor = Color.BLACK;
    /**
     * 坐标轴标题颜色
     */
    protected Color titleColor = Color.BLACK;
    /**
     * 坐标轴画笔
     */
    protected BasicStroke stroke = new BasicStroke(1F);
    /**
     * 坐标轴改变监听器
     */
    protected AxisChangeListener listener = null;

    /**
     * 将数值通过坐标轴转换成像素
     *
     * @param value
     * @return
     */
    public abstract double valueToPix(double value);

    /**
     * 将像素通过坐标轴转换成数值
     *
     * @param pix
     * @return
     */
    public abstract double PixToValue(double pix);

    /**
     * 坐标重置，恢复成缓存的坐标
     */
    public void resetAxis() {
        this.startValueNow = startValue;
        this.endValueNow = endValue;
        this.repaint();
        if (listener != null) {
            listener.axisChanged(this);
        }
    }

    /**
     * @return the startValue
     */
    public double getStartValueNow() {
        return startValueNow;
    }

    /**
     * @param startValueNow the startValue to set
     */
    public void setStartValueNow(double startValueNow) {
        this.startValueNow = startValueNow;
        this.repaint();
        if (listener != null) {
            listener.axisChanged(this);
        }
    }

    /**
     * @return the endValue
     */
    public double getEndValueNow() {
        return endValueNow;
    }

    /**
     * @param endValueNow the endValue to set
     */
    public void setEndValueNow(double endValueNow) {
        this.endValueNow = endValueNow;
        this.repaint();
        if (listener != null) {
            listener.axisChanged(this);
        }
    }

    /**
     * @return the startValueTemp
     */
    public double getStartValue() {
        return startValue;
    }

    /**
     * @param startValue the startValueTemp to set
     */
    public void setStartValue(double startValue) {
        this.startValue = startValue;
        if (chartPanel.getCurvePanel().isAutoAxis()) {
            this.setStartValueNow(startValue);
        }
    }

    /**
     * @return the endValueTemp
     */
    public double getEndValue() {
        return endValue;
    }

    /**
     * @param endValue the endValueTemp to set
     */
    public void setEndValue(double endValue) {
        this.endValue = endValue;
        if (chartPanel.getCurvePanel().isAutoAxis()) {
            this.setEndValueNow(endValue);
        }
    }

    /**
     * @return the title
     */
    public String getTitle() {
        return title;
    }

    /**
     * @param title the title to set
     */
    public void setTitle(String title) {
        this.title = title == null ? "" : title;
        this.repaint();
    }

    /**
     * @return the listener
     */
    public AxisChangeListener getListener() {
        return listener;
    }

    /**
     * @param listener the listener to set
     */
    public void setListener(AxisChangeListener listener) {
        this.listener = listener;
    }

    /**
     * 设置当前显示坐标值前的验证，用于缩放到极限时绘制重复的坐标
     *
     * @param startValueNow 新的坐标起点
     * @param endValueNow 新的坐标终点
     * @return 验证通过返回true,可进行设置，验证失败返回false,不可进行设置
     */
    public boolean setValueCheck(double startValueNow, double endValueNow) {
        return true;
    }
}
